package cn.tedu.mall.search.service.impl;

import cn.tedu.mall.common.restful.JsonPage;
import cn.tedu.mall.pojo.product.model.Spu;
import cn.tedu.mall.pojo.search.entity.SpuForElastic;
import cn.tedu.mall.product.service.front.IForFrontSpuService;
import cn.tedu.mall.search.repository.SpuForElasticRepository;
import cn.tedu.mall.search.service.ISearchService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class SearchServiceImpl implements ISearchService {
    //dubbo调用product模块的分页查询所有spi的方法
    @DubboReference
    private IForFrontSpuService dubboSpuService;

    @Autowired
    private SpuForElasticRepository spuRepository;

    @Override
    public void loadSpuByPage() {
        // 基本思路:dubbo调用分页查询,获取数据库中spu信息
        // 然后将这页数据批量新增到ES
        // 需要考虑循环如何编写
        // 分页查询返回值JsonPage中是包含本次查询的总页数的,总页数就是循环的次数
        // 但是需要先运行一次查询,才能知道这个值,符合"先运行,后判断"的规则,所以使用do-while
        int i=1;  // 循环变量,从1开始,因为分页查询页码从1开始,可以直接使用i
        int page; // 总页数,也是循环条件,会在循环运行完第一次之后赋值
        do {
            JsonPage<Spu> spus = dubboSpuService.getSpuByPage(i, 10);
            //往ES中添加数据
            List<SpuForElastic> esSpus = new ArrayList<>();
            for (Spu spu : spus.getList()){
                SpuForElastic spuForElastic = new SpuForElastic();
                BeanUtils.copyProperties(spu,spuForElastic);
                esSpus.add(spuForElastic);
            }
            spuRepository.saveAll(esSpus);
            log.info("信息加载成功,第{}页",i);
            i++;
            page = spus.getTotalPage();//总页数
        }while (i<=page);
    }
    @Override
    public JsonPage<SpuForElastic> search(String keyword, Integer page, Integer pageSize) {
        Page<SpuForElastic> spus = spuRepository.querySearch(keyword, PageRequest.of(page - 1, pageSize));
        JsonPage<SpuForElastic> jsonPage = new JsonPage<>();
        jsonPage.setPage(page);
        jsonPage.setPageSize(pageSize);
        jsonPage.setTotal(spus.getTotalElements());
        jsonPage.setTotalPage(spus.getTotalPages());

        jsonPage.setList(spus.getContent());
        return jsonPage;
    }


}
